/*
 * author: Andriamananony, Meß, Falk
 */

package util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

import JSONWrappers.JSONObjectWrapper;
import JSONWrappers.JSONOperationWrapper;
import JSONWrappers.JSONOrderWrapper;
import JSONWrappers.JSONProduktWrapper;
import JSONWrappers.JSONVariantWrapper;
import auftrag.Auftrag;
import auftrag.Operation;
import auftrag.Produkt;
import auftrag.Ressource;
import auftrag.Variante;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JSONParser {
	HashMap<String, Ressource> mResources = new HashMap<String, Ressource>();
	HashMap<String, ArrayList<Produkt>> mProducts = new HashMap<String, ArrayList<Produkt>>();
	ArrayList<Auftrag> mOrders = new ArrayList<Auftrag>();
	
	public JSONParser(String file){
		TimeLog.logInfo("Start JSON");

		try {
			JSONObjectWrapper o = null;
			
			FileInputStream fs = new FileInputStream(file);
			InputStreamReader in = new InputStreamReader(fs);
		
			Gson gson = new GsonBuilder().create();
			o = gson.fromJson(in, JSONObjectWrapper.class);
			
			for(String r : o.resources)
				mResources.put(r, new Ressource(r));
			
			for(JSONOrderWrapper orderWrapper : o.orders){
				Auftrag a = new Auftrag(orderWrapper.id, orderWrapper.priority, orderWrapper.start, orderWrapper.end);
				mOrders.add(a);
				
				ArrayList<Produkt> temp = new ArrayList<Produkt>();
				for(int j = 0; j < orderWrapper.quantity; j++)
					temp.add(new Produkt(a, orderWrapper.product));
				
				if(mProducts.containsKey(orderWrapper.product))
					mProducts.get(orderWrapper.product).addAll(temp);
				else 
					mProducts.put(orderWrapper.product, temp);
			 
			}
			for(JSONProduktWrapper produktWrapper : o.products){
				ArrayList<Produkt> prodList = mProducts.get(produktWrapper.name);
			
				for(Produkt p : prodList){
					int nV = 1;
					for(JSONVariantWrapper v : produktWrapper.variants){
						Variante tmpVariante = new Variante(p, nV);
						for(JSONOperationWrapper op : v.operations){
							new Operation(tmpVariante, op.index, mResources.get(op.resource), op.duration);
						}
						nV++;
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		TimeLog.logInfo("End JSON");
	}
		
	public ArrayList<Auftrag> getOrders(){
		return mOrders;
	}
	
	public ArrayList<Ressource> getRessources(){
		ArrayList<Ressource> r = new ArrayList<Ressource>();
		r.addAll(mResources.values());
		return r;
	}
	
	public void print(){
		TimeLog.logInfo("=============================================");
		TimeLog.logInfo("=== Aufträge");
		TimeLog.logInfo("=============================================");
	
		for(Auftrag a : mOrders){
			TimeLog.logInfo(""+a.getAuftragsnummer());
			for(Produkt p : a.getAuftragProdukte()){
				TimeLog.logInfo("\t "+p);
				int iv = 0;
				for(Variante v: p.getProduktVariante()){
					TimeLog.logInfo("\t\t Variante: "+iv);
					iv++;
					int io = 0;
					for(Operation o : v.getOperations()){
						TimeLog.logInfo("\t\t\t Operation "+io+": "+o.getRessource()+ " - "+o.getDuration()+"-"+o.getStep());
						io++;
					}
				}	
			}
		}
	}
}
